docs(changeset): correct two false mechanism claims in a pending connector-ledger note - #19746
Conversation
…ector-ledger note `.changeset/18582-connector-analytics-cube-liveness-ledgers.md` line 9 carries two statements that were false when written. Both re-measured at the parent of the commit that added the fragment (559041d^), so no later change is involved: - the key-reach enumeration double-counted `name` (it is itself a `ConnectorProviderContext` field), over-included `loadPackageFile` (host-injected by the materializer, never authored) and omitted `provider` (read on the authoring door to gate the desired set and select the factory, and absent from the context). - `authentication` was described as "refused outright ... never ignored", while `connector.zod.ts` declares it `.optional().default({ type: 'none' })` and the cross-field rule rejects only a non-`none` VALUE; the ADR section it names rejects inline secrets in stack metadata, not the key. The dated measurements on the same line - the property counts and the dead-subsystem list - are deliberately left exactly as written. They were accurate when made; a later measurement overtaking them is the record working, not a defect in it. Claude-Session: https://claude.ai/code/session_013RDBh5DqXd2xnLwvHLgLFr Co-authored-by: Claude <noreply@anthropic.com>
Route 0 confirmation — DELIBERATE CORRECTION, awaiting a countersignature
The note. What changed under it. Exactly two sentences on line 9, both established false when written against instruments read at
Old and new text quoted verbatim in the PR body, with the per-claim measurements. What did not change. The dated measurements on the same line — the property counts and the dead-subsystem list — and the other three carriers. Those were accurate when made; overwriting them would falsify history rather than correct a record. The red is intended. Asked of a reviewer: confirm in this thread that correcting this pending release note is agreed, and merge over the red. Generated by Claude Code |
Seat note — the red is expected, and TWO different things are outstandingFrom the The failing check is ⛔ not a defect, and was declared before the work started
⇒ ⛔ This is not the 「red CI is work now」 case. ⛔ Do not restore the false sentence to turn it green, and ⛔ do not apply Two outstanding items, ⛔ different acts, ⛔ different signatories1. The at-tier contract review — the seat's to arrange, ⛔ NOT a countersignature. 2. The route-0 countersignature — a HUMAN act, and ⛔ this seat cannot supply it. The clock, restated because it is the reason this card jumped the queueBoth fragments are pending. ⛔ That is a reason to answer, ⛔ never a reason to merge without the answer. Generated by Claude Code |
|
Served-tier: 91/91 Subject: Tier control: ① Derived judgmentsTrees: S = (a) old — «
|
Maintainer instruction —
|
Confirmation of record (ruling D ② B) — replaces the label route
⇒ Ruling D stands. The confirmation is this chat sentence, carried here. Generated by Claude Code |
Part of #19729
What this changes
Two sentences on
.changeset/18582-connector-analytics-cube-liveness-ledgers.md:9— the card's class 1, the two statements that were false when written. One file, one line,+1 / -1. No other sentence in that fragment, and no other fragment, is touched.DELIBERATE CORRECTION — this is the written confirmation
pr-automation.ymlroute 0 requires, andCheck Changesetis RED on purposeThis PR adds no changeset of its own; it changes a pending changeset it did not add. Route 0's discriminator, run against this PR's merge base:
Every row is
M, none isA⇒ route 0. The class is DELIBERATE CORRECTION, not COLLISION: this PR did not draw that filename, nothing of its own was overwritten, and the base copy must not be restored — restoring it republishes the false sentences.check-empty-changeset.mjsreaches the same reading on its own and prints it in the job log.skip-changesetCheck ChangesetREDThe note
.changeset/18582-connector-analytics-cube-liveness-ledgers.md—"@objectstack/spec": patch, pending, added by commit559041d39d.changeset versiondeletes the fragment and publishes its text verbatim intopackages/spec/CHANGELOG.md, and thechore: version packagesPR that performs that is open right now. That is the window this correction is inside.What changed under it — old and new, verbatim
(a) old:
(a) new:
(b) old:
(b) new:
Why these two are defects in the record and not a dated reading
Every instrument below was read at
559041d39d^— the parent of the commit that added the fragment — so nothing that changed afterwards is involved. The card's readings were treated as input and re-derived, not quoted.559041d39d^authenticationis "refused outright"packages/spec/src/integration/connector.zod.ts:753authentication: ConnectorAuthConfigSchema.optional().default({ type: 'none' })— the key is accepted, and defaulted.:970if (entry.authentication && entry.authentication.type !== 'none')— only a non-nonevalue raises an issue, and that refusal's own message prescribes "dropauthentication(or set{ type: 'none' })", which is only sayable if the key is accepted.docs/adr/0097-declarative-connector-instances.md§3, titled "Credentials are references"packages/spec/liveness/connector.json,props.authentication.note, seeded by the same commit{ type: 'none' }… Notlive: the accepted value does nothing". The same commit wrote the correct statement in the ledger and the false one in the changeset.name"packages/spec/src/integration/connector-provider.ts:58readonly name: stringis itself aConnectorProviderContextfield ⇒ the tail double-counted it.loadPackageFileincluded:77;packages/services/service-automation/src/plugin.ts:1546createPackageFileLoader(this.options.packageRoot)— host-injected, reached by no authored key ⇒ over-included.providerabsentplugin.ts:1451,:1494if (typeof entry.provider !== 'string' ...) continuegates the desired set andconst provider = entry.providerthen selects the factory, soprovideris read on the authoring door; it is on no field ofConnectorProviderContext⇒ omitted.Both replacement sentences are date-neutral: they name no count and no enumeration, so they stay true at the seeding tree and at
origin/mainalike.What deliberately did NOT change
The rest of line 9 is left byte-for-byte as written, because each of these was true when written and has merely been overtaken. A dated record's job is to say what was true when it was made, so overwriting it would falsify history rather than correct a record:
74 properties: 20 live, 1 planned, 53 dead— the seeding-time measurement.four declared subsystems with no engine — syncConfig, fieldMappings, retryConfig, health—retryConfigwas genuinely dead when written.And these carriers are not touched at all, for the same reason:
.changeset/18614-conversion-registry-retryconfig-liveness-claim.md.changeset/18983-connector-header-rate-limit-remedy.mdpackages/spec/src/conversions/registry.tsVerification
Gate families derived from this worktree, never from the shared checkout:
It derived 19 families at commit
752992dd28. All 19 were run, each exit code captured before any pipe, and reconciled:18 of 19 exit 0. The one non-zero is the expected one:
node scripts/check-empty-changeset.mjs --base origin/main— exit 1, the route-0 red. Its output names this PR's class as DELIBERATE CORRECTION unprompted and ends "this gate stays red either way, and staying red is what puts the decision in front of a person instead of routing around it."Run in addition, because
dispatch-gatesflagged that its roster lives under.changeset, which is where this PR's only path is:node scripts/check-changeset-fixed.mjs— exit 0, ".changeset/config.json"fixed" group is in sync with 70 public workspace packages" (a verdict over a real population, not a vacuous green).Repo-wide
pnpm lintnarrowed to this diff, and the narrowing proven rather than asserted — all three readings, so the narrowing is a measurement and not a skip:isPathIgnored('.changeset/18582-connector-analytics-cube-liveness-ledgers.md')istrue; the positive controlisPathIgnored('scripts/check-nul-bytes.mjs')isfalseon the same call, so the predicate can answer either way. Everyfilesglob ineslint.config.mjsnames TS/JS extensions only, and the config contains zero occurrences ofmarkdownor the markdown extension.--format json: one result entry,errorCount0, and its only message is "File ignored because no matching configuration was supplied" — zero rules evaluated. The same command over the control path produces a genuinely linted entry.No package build, test or typecheck is owed: the diff touches one
.changeset/*.mdfile and no package source, so there is no affected-package closure and no package's public surface moves.Control characters:
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'over the changed file reports nothing, with the same pattern firing on a seeded control file in the same run.Acceptance notes
Observations found while verifying, deliberately not acted on in this PR:
origin/main, both written by the same seeding commit559041d39d:packages/spec/liveness/README.md'sconnectorrow (both claims) andpackages/spec/liveness/connector.json's_note(claim (b) only). Not filed and not edited — both are already corrected on the open PR feat(spec)!: retire connector.connectionTimeoutMs — carried everywhere, applied nowhere #19657's head, verified by reading that head directly. Carrier: PR feat(spec)!: retire connector.connectionTimeoutMs — carried everywhere, applied nowhere #19657.packages/spec/liveness/README.md:942. Atorigin/mainthat line still carries the old, false wording; the corrected text exists only on PR feat(spec)!: retire connector.connectionTimeoutMs — carried everywhere, applied nowhere #19657's head, which is not merged. The wording used here was derived at source instead, and it agrees with feat(spec)!: retire connector.connectionTimeoutMs — carried everywhere, applied nowhere #19657's.origin/main(connector-provider.ts:68vs:65;plugin.ts:1478/:1533/:1601vs:1470/:1513and:1525/:1594). Substance is identical; noted only so a re-measurer does not read the drift as disagreement.Generated by Claude Code